home *** CD-ROM | disk | FTP | other *** search
- // 68KPatch.c
-
- #include <A4Stuff.h>
- #include "main.h"
-
- SpotlightGlobals *globptr;
-
- pascal UInt32 (*gKeyTranslateAddr)(const void *transData, UInt16 keycode, UInt32 *state);
- pascal UInt32 MyKeyTranslate(const void *transData, UInt16 keycode, UInt32 *state);
-
- pascal Boolean (*gOSEventAvailAddr)(register EventMask mask:__D0, register EventRecord *event:__A0) : __D0;
- #pragma parameter __D0 MyOSEventAvail(__D0, __A0)
- pascal Boolean MyOSEventAvail(EventMask mask, EventRecord *event);
-
- #define _DragDispatch 0xABED
- asm void MyDragDispatchASM(void);
- pascal OSErr MyDrawingProc(DragRegionMessage message, RgnHandle showRegion, Point showOrigin, RgnHandle hideRegion, Point hideOrigin, void *dragDrawingRefCon, DragReference theDrag);
-
- pascal void (*gModalDialogAddr)(ModalFilterUPP modalFilter, DialogItemIndex *itemHit);
- pascal void MyModalDialog(ModalFilterUPP modalFilter, DialogItemIndex *itemHit);
-
- void main(SpotlightGlobals *glob) {
- EnterCodeResource();
-
- globptr = glob;
-
- gKeyTranslateAddr = (void*)NGetTrapAddress(_KeyTranslate, ToolTrap);
- NSetTrapAddress((ProcPtr)MyKeyTranslate, _KeyTranslate, ToolTrap);
-
- gOSEventAvailAddr = (void*)NGetTrapAddress(_OSEventAvail, OSTrap);
- NSetTrapAddress((ProcPtr)MyOSEventAvail, _OSEventAvail, OSTrap);
-
- globptr->myDrawUPP = NewDragDrawingProc(MyDrawingProc);
- globptr->dragDispatchAddr = NGetTrapAddress(_DragDispatch, ToolTrap);
- *(long*)((long)MyDragDispatchASM + 2) = (long)globptr;
- NSetTrapAddress((ProcPtr)MyDragDispatchASM, _DragDispatch, ToolTrap);
-
- gModalDialogAddr = (void*)NGetTrapAddress(_ModalDialog, ToolTrap);
- NSetTrapAddress((ProcPtr)MyModalDialog, _ModalDialog, ToolTrap);
-
- ExitCodeResource();
- }
-
- pascal UInt32 MyKeyTranslate(const void *transData, UInt16 keycode, UInt32 *state) {
- UInt32 charCode;
- EnterCodeResource();
-
- if (globptr->active) {
- // clear modifier bits so we can type normally
- // (for renaming stuff etc.)
-
- keycode &= ~globptr->prefs.disableModifiers;
- }
- charCode = gKeyTranslateAddr(transData, keycode, state);
-
- ExitCodeResource();
- return charCode;
- }
-
- pascal Boolean MyOSEventAvail(register EventMask mask:__D0, register EventRecord *event:__A0) : __D0
- {
- Boolean gotEvent;
- EnterCodeResource();
-
- gotEvent = gOSEventAvailAddr(mask, event);
- if (globptr->active) {
- // clear modifier bits so we can do other stuff normally
- // (for dragging icons etc.)
-
- event->modifiers &= ~globptr->prefs.disableModifiers;
- }
-
- ExitCodeResource();
- return gotEvent;
- }
-
- asm void MyDragDispatchASM(void) {
- bra @start
-
- globdata: dc.l 0
-
- @start:
- // store the globals which we will need regardless
- move.l globdata, a0
- // see if it's SetDragDrawingProc
- cmpi.w #0x000C, d0
- bne @callOriginal
-
- // see if the spotlight is active
- move.l struct(SpotlightGlobals.active)(a0), d1
- btst #24, d1
- beq @callOriginal
-
- // patch
- // clear the deactivating variable
- move.l #0, struct(SpotlightGlobals.deactivating)(a0)
- // store their UPP
- move.l 8(sp), struct(SpotlightGlobals.theirDrawUPP)(a0)
- // put in our UPP
- move.l struct(SpotlightGlobals.myDrawUPP)(a0), 8(sp)
-
- @callOriginal:
- move.l struct(SpotlightGlobals.dragDispatchAddr)(a0), -(sp)
- rts
- }
-
- #define modKeysDown(modifiers) ((modifiers & globptr->prefs.activateModifiers) == globptr->prefs.activateModifiers)
-
- pascal OSErr MyDrawingProc(
- DragRegionMessage message, RgnHandle showRegion,
- Point showOrigin, RgnHandle hideRegion, Point hideOrigin,
- void *dragDrawingRefCon, DragReference theDrag)
- {
- OSErr err;
- EnterCodeResource();
-
- if (!globptr->deactivating) {
- QElemPtr eventInQueue;
- EventRecord event;
-
- // we cannot check the modifiers in the proceeding loop because not all events are
- // put in the system event queue (e.g., null events)
- gOSEventAvailAddr(everyEvent, &event);
- if (!modKeysDown(event.modifiers)) globptr->deactivating = true;
-
- CALL_TWO_PARAMETER_UPP(globptr->showSpotlightUPP, uppShowSpotlightInfo, showOrigin, true);
- for ( eventInQueue = LMGetEventQueue()->qHead;
- eventInQueue != nil;
- eventInQueue = eventInQueue->qLink)
- {
- if (modKeysDown(((EvQElPtr)eventInQueue)->evtQModifiers))
- ((EvQElPtr)eventInQueue)->evtQModifiers &= ~globptr->prefs.disableModifiers;
- }
- //SystemTask();
- }
-
- err = CallDragDrawingProc(globptr->theirDrawUPP, message, showRegion, showOrigin,
- hideRegion, hideOrigin, dragDrawingRefCon, theDrag);
-
- ExitCodeResource();
- return err;
- }
-
- pascal void MyModalDialog(ModalFilterUPP modalFilter, DialogItemIndex *itemHit) {
- EnterCodeResource();
-
- globptr->lastModalDialog = FrontWindow();
- gModalDialogAddr(modalFilter, itemHit);
-
- ExitCodeResource();
- }